// Esto es de http://stackoverflow.com/a/6198616/276451
function remove_from_array(a, key) 
{
	for(var i = 0; i < a.length; ++i)
	{
		if(a[i] == key)
		{
			a.splice(i, 1);
			return a;
		}
	}
}

var x = {}

function getSelected() {
    var t = '';
    if (window.getSelection) {
        t = window.getSelection();
    } else if (document.getSelection) {
        t = document.getSelection();
    } else if (document.selection) {
        alert("¿Está usando Internet Explorer? Navegador no soportado");
    }
    var f = t.getRangeAt(0);
    return [f.startOffset, f.endOffset];
}

// Contenedor de etiquetas
var wikeval_etiquetas = {}

// Indica la última etiqueta añadida
var wikeval_ultima_etiqueta = 0;

// Rangos de color a colorear
var rangos = []

// Rangos totales
var rangos_raw = []

function agregar_rango(nuevo_rango){
	
	if(rangos.length == 0){
		rangos.push(nuevo_rango);
		return
	}
	
	var new_f = nuevo_rango[0];
	var new_t = nuevo_rango[1];
	
	var nuevo_conjunto_rangos = [];
	
	for (i in rangos){
		var old_f = rangos[i][0];
		var old_t = rangos[i][1];
		
		if (!((new_t < old_f) || (old_t < new_f))) {				
			new_f = Math.min(new_f, old_f);
			new_t = Math.max(new_t, old_t);					
		} else {
			nuevo_conjunto_rangos.push([old_f, old_t]);
		}
	}
	
	nuevo_conjunto_rangos.push([new_f, new_t]);
	rangos = nuevo_conjunto_rangos;
}

function procesar_rangos(conjunto) {
	
    var indices_procesados = [];
    var rangos = [];

    for (i in conjunto) {

        var f1 = conjunto[i][0];
        var t1 = conjunto[i][1];
        
        var fx, tx;

        for (j in conjunto) {
            if (i == j) continue

            var f2 = conjunto[j][0];
            var t2 = conjunto[j][1];
            
            if (!((t1 < f2) || (t2 < f1))) {
                f1 = Math.min(f1, f2);
                t1 = Math.max(t1, t2);
            }            
        }
        
        rangos[f1] = t1;
    }

    return rangos;
}

// Recolorea el cuadro de texto
function recolorear(){
	
    var textoOriginal = $("#wikeval_textarea").text();
    var textoNuevo = textoOriginal;
    
    var startTag = "<span style='background-color: #c6ef95'>";
    var endTag = "</span>";
    var wrapLength = startTag.length + endTag.length

    var extraLength = 0;
	var r = [];
    
    for(i in wikeval_etiquetas){		
        var et = wikeval_etiquetas[i];
        r.push([et.frag_start, et.frag_end]);
    }
    
    var offset = 0;
    
    for (r in rangos){
		
		var from = parseInt(rangos[r][0]);
		var to = parseInt(rangos[r][1]);
		var len = to - from;
		
		console.log("Rango", from, "a", to, "(", len, "), offset", offset);
		
        textoAntes = textoNuevo.substr(0, from + offset);
        textoDentro = textoNuevo.substr(from + offset, len);
        textoDespues = textoNuevo.substr(to + offset);

        //~ console.log("ANTES: ", textoAntes);
        //~ console.log("ENTRE: ", textoDentro);
        //~ console.log("DESP:  ", textoDespues);

        textoNuevo = textoAntes + startTag + textoDentro + endTag + textoDespues;
        
        offset += wrapLength;
    }

    console.log("WUT");

    $("#wikeval_textarea_back").html(textoNuevo);
}



// Genera el código HTML asociado a una etiqueta con los datos indicados
function generar_cuerpo_etiqueta(et){
	cuerpo = ""
	cuerpo += "<div class='wikeval_etiqueta_listada clearfix' id= 'wikeval_etiqueta_" + et.id + "'>";
	cuerpo += "<div class='izquierda'>";
	cuerpo += "<strong>ID de etiqueta: </strong>" + et.id + "<br>";
	cuerpo += "<strong>Rúbrica: </strong>" + et.eval_rub + "<br>";
	cuerpo += "<strong>Concepto: </strong>" + et.eval_con + "<br>";
	cuerpo += "<strong>Propiedad: </strong>" + et.eval_prop + "<br>";	
	cuerpo += "</div>";
		
	cuerpo += "<div class='izquierda'>";
	cuerpo += "<strong>Valor: </strong>" + et.eval_val+ "<br>";

	if (et.frag_start == et.frag_end){		
		cuerpo += "<strong>Fragmento: </strong> Todo el documento<br>";
	} else { 
		cuerpo += "<strong>Fragmento: </strong> De " + et.frag_start + " a " + et.frag_end + "<br>";
	}
	
	cuerpo += "<strong>Comentario: </strong>" + et.comment + "<br>";
	cuerpo += "</div>";
		
	cuerpo += "<div class='derecha'>";
	cuerpo += "<input type='button' class='btn danger btnBorrarEtiqueta' value='Borrar' data-etiqueta='" + et.id + "'>";
	cuerpo += "</div>";						
	cuerpo += "</div>";	
	
	return cuerpo;
}

// Añade una nueva etiqueta con los datos del formulario
// Se ejecuta al pulsar el botón "etiquetar"
function anadir_etiqueta(e){
	e.preventDefault();

    sel = getSelected();
	
	et = {
		id : wikeval_ultima_etiqueta,
		
		frag_start : sel[0],
		frag_end : sel[1],

		comment : $("#wikeval_formulario_comentario").val().trim(),

		eval_rub : $("#wikeval_formulario_rubrica option:selected").text(),
		eval_con : $("#wikeval_formulario_concepto option:selected").text(),
		eval_prop : $("#wikeval_formulario_propiedad option:selected").text(),
		eval_val : $("#wikeval_formulario_valor").val().trim()		
	};

	// Comprobamos que el valor está relleno
	if (et.eval_val == ""){
		alert("Debe escribir algún valor para la propiedad.");
		return;
	}	

	// Generamos el código HTML de la etiqueta
	cuerpo_etiqueta = generar_cuerpo_etiqueta(et);	
	
	// Añadimos la etiqueta al contenedor de la página
	$("#wikeval_contenedor_etiquetas").append(cuerpo_etiqueta);

	// Reiniciamos los formularios
	//$("#wikeval_formulario_valor, #wikeval_formulario_comentario").val("");

    // Añadimos la etiqueta al contenedor interno
	wikeval_etiquetas[wikeval_ultima_etiqueta] = et;

	// Actualizamos el contador de etiquetas
	wikeval_ultima_etiqueta ++;

	recalcular_rangos();
    recolorear();
}

function recalcular_rangos(){
	rangos = [];
	
	for (i in wikeval_etiquetas){
		var et = wikeval_etiquetas[i];
		
		var f = et.frag_start;
		var t = et.frag_end;
		
		agregar_rango([f, t]);
	}		
}

function borrar_etiqueta(n){
	$("#wikeval_etiqueta_" + n).remove();
	delete wikeval_etiquetas[n];	
	
	recalcular_rangos();
	recolorear();
}

// Genera el HTML para un input type=hidden 
function gen_oc(k, v){
	return '<input type="hidden" name="' + k + '" value = "' + v + '">';
}

// Para enviar la información, se generan campos input ocultos donde
// se guardan los datos de cada etiqueta
function enviar_etiquetas(e){	
	c = $("#wikeval_formulario_oculto");
	s = 0;

	
	for (k in wikeval_etiquetas){
		for (k2 in wikeval_etiquetas[k]){
			c.append(gen_oc("et_" + s + "_" + k2, wikeval_etiquetas[k][k2]));
		}
		s++;		
	}

	if (s == 0){
		alert("Debes añadir alguna etiqueta");
		e.preventDefault();
		return;
	}

	// Metemos los atributos globales a todas las etiquetas 
	c.append(gen_oc("article_id", $("#wikeval_formulario_articulo").val()));
	c.append(gen_oc("article_rev", $("#wikeval_formulario_revision").val()));
	c.append(gen_oc("user_id", $("#wikeval_formulario_usuario").val()));
	
	c.append(gen_oc("num_etiquetas", s));
}

// ####################################################################
//  Gestión de la información en la rúbrica

// La variable "wikeval_rubricas" la rellena el PHP con la información
// de la rúbrica

// Rellena el select de rúbricas
function repoblar_rubricas(){

	// Por cada rúbrica
	for(rubrica in wikeval_rubricas){

		// Añadie una opción en el selector de rúbricas
		$("#wikeval_formulario_rubrica").append(
			"<option value=" + rubrica + ">" + wikeval_rubricas[rubrica].label + "</option>" 
		);
	}
	
	repoblar_conceptos();
}

// Rellena el select de conceptos para cada rúbrica
function repoblar_conceptos(){

	// Coge los datos de la rúbrica seleccionada
	rubrica_seleccionada = wikeval_rubricas[$("#wikeval_formulario_rubrica").val()];

	// Borra los conceptos que estén activos
	$("#wikeval_formulario_concepto").empty();
	
	for (concepto in rubrica_seleccionada["children"]){

		// Añade cada concepto al select
		$("#wikeval_formulario_concepto").append(
			"<option value=" + concepto + ">" + rubrica_seleccionada["children"][concepto].label + "</option>"
		);
	}
	
	repoblar_propiedades();
}

// Rellena el select de propiedades del concepto indicado
function repoblar_propiedades(){

	// Coge los datos de la rúbrica seleccionada
	rubrica_seleccionada = wikeval_rubricas[$("#wikeval_formulario_rubrica").val()];

	// Coge los datos del concepto seleccionado
	concepto_seleccionado = rubrica_seleccionada["children"][$("#wikeval_formulario_concepto").val()];

	// Borra las propiedades que ya estén
	$("#wikeval_formulario_propiedad").empty();
	
	for (propiedad in concepto_seleccionado["properties"]){

		// Añade la nueva propiedad al select
		$("#wikeval_formulario_propiedad").append(
			"<option value=" + propiedad + ">" + concepto_seleccionado["properties"][propiedad].label + "</option>"
		);
	}
}

jQuery(function($){
		
	repoblar_rubricas();
	
	$("#wikeval_formulario_etiquetar").click(anadir_etiqueta);
	$("#wikeval_formulario_rubrica").change(repoblar_conceptos);
	$("#wikeval_formulario_concepto").change(repoblar_propiedades);
	$("#wikeval_formulario_enviar").click(enviar_etiquetas);
	
	$(".btnBorrarEtiqueta").live("click", function(){
		borrar_etiqueta($(this).data("etiqueta"));
	});
});
